#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/shm.h>
#include "shm_reader.h"

extern char* shm_ptr;  // 共享内存指针
extern int shm_id;      // 共享内存ID


int init_shm() {
    shm_id = shmget(SHM_KEY, SHM_SIZE, 0666);  // 不使用IPC_CREAT，避免重复创建
    if (shm_id == -1) {
        // 若不存在再尝试创建
        shm_id = shmget(SHM_KEY, SHM_SIZE, IPC_CREAT | 0666);
        if (shm_id == -1) {
            perror("Failed to create shared memory");
            return -1;
        }
    }

    // 附加共享内存
    shm_ptr = shmat(shm_id, NULL, 0);
    if (shm_ptr == (void*)-1) {
        perror("Failed to attach shared memory");
        return -1;
    }
    
    return 0;
}

// 直接返回共享内存指针（无需复制，零拷贝）
const char* read_shm_data_direct() {
    return (shm_ptr != NULL) ? shm_ptr : NULL;
}

char* read_shm_data() {
    if (shm_ptr == NULL) {
        return NULL;
    }
    
    // 直接使用全局指针读取数据
    return strdup(shm_ptr);
}

void cleanup_shm() {
    if (shm_ptr != NULL) {
        shmdt(shm_ptr);
        shm_ptr = NULL;
    }
}